package part01_七大原则.p05_开闭原则;

/**开闭原则改进：
 * 1-上一个类，如果要新增一种图形，那么就需要增加图形类，修改已有的Editor类里的draw方法
 * 为了不修改已有的类，就把draw方法放到每个类里面，让类自己去实现
 * @ClassName: Ocp02
 * @Author: AllenSun
 * @Date: 2019/12/3 21:40
 */
public class Ocp02 {
    public static void main(String[] args) {
        GraphicEditor02 graphicEditor = new GraphicEditor02();
        graphicEditor.drawShape(new Rectangle02());
        graphicEditor.drawShape(new Circle02());
        graphicEditor.drawShape(new Triangle02());
        graphicEditor.drawShape(new OtherShape());
    }
}

//这是一个用于绘画的类（使用方）
class GraphicEditor02{
    public void drawShape(Shape02 shape){
        shape.draw();
        }

    /*public void drawRectangle(Shape r){
        System.out.println("绘制矩形");
    }
    public void drawCircle(Shape c){
        System.out.println("绘制圆形");
    }
    public void drawTriangle(Shape t){
        System.out.println("绘制三角形");
    }
    */
}

//图形类，是父类，具体是什么图形交给继承类去实现
//把类改成“抽象类”，新增一个抽象方法，由继承类去实现，这样draw方法都在类里完成
abstract class Shape02{
    int m_type;
    public abstract void draw();
}

//实现类，正方形
class Rectangle02 extends Shape02{
    Rectangle02(){
        super.m_type=1;
    }

    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

//实现类，圆形
class Circle02 extends Shape02{
    Circle02(){
        super.m_type=2;
    }

    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

//实现类，三角形
class Triangle02 extends Shape02{
    @Override
    public void draw() {
        System.out.println("绘制三角形");
    }

    Triangle02(){
        super.m_type=3;
    }
}

class OtherShape extends Shape02{
    public OtherShape() {
    }

    @Override
    public void draw() {
        System.out.println("新增的绘制其他图形，且不改变Editor类");
    }
}